package br.com.hs.nfe.common.to;

import br.com.hs.nfe.common.anotation.NotInsert;
import java.util.ArrayList;
import java.util.List;

/**
 * Classe base para TAD Objects.
 * @author Ranlive Hrysyk
 */
public abstract class BaseTO implements Cloneable {

    private List<String> errorList;
    private List<String> messageList;
    @NotInsert
    private List<String> validationErrors;

    /**
     * Adiciona uma mensagem de erro a classe.
     * @param error Mensagem
     */
    public void addError(String error) {
        if (errorList == null) {
            errorList = new ArrayList<String>();
        }
        messageList = null;
        errorList.add(error);
    }

    /**
     * Adiciona uma mensagem informativa a classe.
     * @param message Mensagem
     */
    public void addMessage(String message) {
        if (messageList == null) {
            messageList = new ArrayList<String>();
        }
        errorList = null;
        messageList.add(message);
    }

    /**
     * Obtém uma lista de erros da classe.
     * @return Retorn uma lista ou null
     */
    public List<String> getErrors() {
        return errorList;
    }

    /**
     * Obtém uma lista de erros da classe.
     * @return Retorna uma lista ou null
     */
    public List<String> getMessages() {
        return messageList;
    }

    /**
     * Verifica se há erros.
     * @return Retorna true se verdadeiro.
     */
    public boolean hasErrors() {
        return (errorList != null) && (!errorList.isEmpty());
    }

    /**
     * Verifica se há mensagens.
     * @return Retorna true se verdadeiro.
     */
    public boolean hasMessages() {
        return (messageList != null) && (!messageList.isEmpty());
    }

    /**
     * Limpa a lista de mensagens de erro.
     */
    public void clearErrors() {
        errorList = null;
    }

    /**
     * Limpa a lista de mensagens informativas.
     */
    public void clearMessages() {
        messageList = null;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    /**
     * Obtém uma lista de erros encontrados na validação.
     * @return Lista de erros.
     */
    public List<String> getValidationErrorList() {
        return validationErrors;
    }

    /**
     * Adiciona um erro a lista de erros.
     * @param error Mensagem de erro.
     */
    public void addValidationError(String error) {
        if (validationErrors == null) {
            validationErrors = new ArrayList<String>();
        }
        validationErrors.add(error);
    }

    /**
     * Limpa as mensagens de erro.
     */
    public void clearValidationError() {
        validationErrors = null;
    }

    /**
     * Retorna true se houver mensagens de erro.
     */
    public boolean hasValidationError() {
        return (validationErrors != null) && (!validationErrors.isEmpty());
    }
}
